home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / CBGRX100.ARJ / LOADDRV.C < prev    next >
Text File  |  1992-04-10  |  6KB  |  211 lines

  1. /** 
  2.  ** LOADDRV.C 
  3.  **
  4.  **  Copyright (C) 1992, Csaba Biegl
  5.  **    820 Stirrup Dr, Nashville, TN, 37221
  6.  **    csaba@vuse.vanderbilt.edu
  7.  **
  8.  **  This file is distributed under the terms listed in the document
  9.  **  "copying.cb", available from the author at the address above.
  10.  **  A copy of "copying.cb" should accompany this file; if not, a copy
  11.  **  should be available from where this file was obtained.  This file
  12.  **  may not be distributed without a verbatim copy of "copying.cb".
  13.  **  You should also have received a copy of the GNU General Public
  14.  **  License along with this program (it is in the file "copying");
  15.  **  if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  16.  **  Cambridge, MA 02139, USA.
  17.  **
  18.  **  This program is distributed in the hope that it will be useful,
  19.  **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  **  GNU General Public License for more details.
  22.  **/
  23.  
  24. #pragma  inline
  25.  
  26. #include "grx.h"
  27. #include "libgrx.h"
  28. #include "grdriver.h"
  29. #include "grxfile.h"
  30. #include "gmalloc.h"
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <ctype.h>
  36. #include <dos.h>
  37. #include <fcntl.h>
  38. #include <io.h>
  39.  
  40. static char driver_loaded = FALSE;
  41. static char new_driver = FALSE;
  42.  
  43. static void far dummy_func(void) {}
  44. static GR_DRIVER far *drv;
  45.  
  46. static void far (*set_mode_func)(void) = dummy_func;
  47. static void far (*set_page_func)(void) = dummy_func;
  48. static unsigned short far *option_word_address;
  49.  
  50.  
  51. static char *near get_token(char *p,char *token)
  52. {
  53.     while(*p == ' ') p++;
  54.     while(*p && (*p != ' ')) { *token++ = tolower(*p); p++; }
  55.     *token = '\0';
  56.     return(p);
  57. }
  58.  
  59. static int near find_keyword(char *p,char *token,char *name)
  60. {
  61.     while(*p != '\0') {
  62.         p = get_token(p,token);
  63.         if(strcmp(token,name) == 0) {
  64.         p = get_token(p,token);
  65.         return((*token == '\0') ? FALSE : TRUE);
  66.         }
  67.     }
  68.     return(FALSE);
  69. }
  70.  
  71. static void near load_driver(void)
  72. {
  73.     void far (*drv_init_func)(void);
  74.     char *p,driver[100];
  75.     int  drvfile,test;
  76.     long size;
  77.  
  78.     if((p = getenv("GRXDRV")) == NULL) {
  79.         if(((p = getenv("GO32")) == NULL) ||
  80.            (find_keyword(p,driver,"driver") == FALSE)) {
  81.         fputs("No graphics driver specified\n",stderr);
  82.         exit(1);
  83.         }
  84.     }
  85.     else p = get_token(p,driver);
  86.     if((drvfile = open(driver,(O_RDONLY | O_BINARY))) < 0) {
  87.         fputs("Graphics driver \"",stderr);
  88.         fputs(driver,stderr);
  89.         fputs("\" not found\n",stderr);
  90.         exit(1);
  91.     }
  92.     size = filelength(drvfile);
  93.     if(!(drv = _GrFarMalloc(size + 16))) {
  94.         fputs("No memory for graphics driver\n",stderr);
  95.         exit(1);
  96.     }
  97.     drv = MK_FP((FP_SEG(drv) + ((FP_OFF(drv) + 15) >> 4)),0);
  98.     if(_GrFarRead(drvfile,drv,size) != size) {
  99.         fputs("Error loading graphics driver\n",stderr);
  100.         close(drvfile);
  101.         exit(1);
  102.     }
  103.     close(drvfile);
  104.     option_word_address = &drv->old.driver_flags;
  105.     if(*option_word_address & GRD_NEW_DRIVER) new_driver = TRUE;
  106.     if(find_keyword(p,driver,"tw") && ((test = atoi(driver)) > 0))
  107.         drv->old.def_tw = test;
  108.     if(find_keyword(p,driver,"th") && ((test = atoi(driver)) > 0))
  109.         drv->old.def_th = test;
  110.     if(find_keyword(p,driver,"gw") && ((test = atoi(driver)) > 0))
  111.         drv->old.def_gw = test;
  112.     if(find_keyword(p,driver,"gh") && ((test = atoi(driver)) > 0))
  113.         drv->old.def_gh = test;
  114.     set_mode_func = (void far (*)())MK_FP(FP_SEG(drv),drv->old.modeset_routine);
  115.     set_page_func = (void far (*)())MK_FP(FP_SEG(drv),drv->old.paging_routine);
  116.     if(new_driver) {
  117.         if(find_keyword(p,driver,"nc") && ((test = atoi(driver)) > 0))
  118.         drv->new.def_numcolor = test;
  119.         drv_init_func = (void far (*)())MK_FP(FP_SEG(drv),drv->new.driver_init_routine);
  120.         asm push di;
  121.         asm push si;
  122.         _BX = FP_OFF((void far *)&drv_init_func);
  123.         _ES = FP_SEG((void far *)&drv_init_func);
  124.         asm push ds;
  125.         asm push WORD  PTR es:[bx+2]
  126.         asm pop  ds;
  127.         asm call DWORD PTR es:[bx];
  128.         asm pop  ds;
  129.         asm pop  si;
  130.         asm pop  di;
  131.         if(_AX == 0) {
  132.         /* You may want to do something more appropriate here */
  133.         fputs("Graphics initialization error -- probably incorrect driver\n",stderr);
  134.         exit(1);
  135.         }
  136.     }
  137.     driver_loaded = TRUE;
  138. }
  139.  
  140. int _GrLowSetMode(int mode,int width,int height,int colors)
  141. {
  142.     int retval;
  143.  
  144.     if(!driver_loaded) load_driver();
  145.     if(!new_driver && (mode == 9)) mode = 6;
  146.     asm push di;
  147.     asm push si;
  148.     _SI = FP_OFF((void far *)&set_mode_func);
  149.     _ES = FP_SEG((void far *)&set_mode_func);
  150.     asm mov  bx,colors;
  151.     asm mov  cx,width;
  152.     asm mov  dx,height;
  153.     asm mov  ax,mode;
  154.     asm push ds;
  155.     asm push WORD  PTR es:[si+2]
  156.     asm pop  ds;
  157.     asm call DWORD PTR es:[si];
  158.     asm pop  ds;
  159.     retval = _BX;
  160.     _GrScreenX = _CX;
  161.     _GrScreenY = _DX;
  162.     asm pop  si;
  163.     asm pop  di;
  164.     return(new_driver ? retval : *option_word_address);
  165. }
  166.  
  167. void GrGetDriverModes(GR_DRIVER_MODE_ENTRY far **t,GR_DRIVER_MODE_ENTRY far **g)
  168. {
  169.     if(!driver_loaded) load_driver();
  170.     if(new_driver) {
  171.        *t = MK_FP(FP_SEG(drv),drv->new.text_table);
  172.        *g = MK_FP(FP_SEG(drv),drv->new.graphics_table);
  173.     }
  174.     else {
  175.        *t = (GR_DRIVER_MODE_ENTRY far *)NULL;
  176.        *g = (GR_DRIVER_MODE_ENTRY far *)NULL;
  177.     }
  178. }
  179.  
  180. /*
  181.  * C entry point
  182.  */
  183. void _GrSetVideoPage(int page)
  184. {
  185.     asm push di;
  186.     asm push si;
  187.     _AX = page;
  188.     (*set_page_func)();
  189.     asm pop  si;
  190.     asm pop  di;
  191. }
  192.  
  193. /*
  194.  * ASM entry point: page(s) in AX
  195.  */
  196. void far _GrSetAsmPage(void)
  197. {
  198.     asm push di;
  199.     asm push si;
  200.     asm push dx;
  201.     asm push cx;
  202.     asm push bx;
  203.     (*set_page_func)();
  204.     asm pop  bx;
  205.     asm pop  cx;
  206.     asm pop  dx;
  207.     asm pop  si;
  208.     asm pop  di;
  209. }
  210.  
  211.